/*
 * 命令模式的目的主要是为了把命令者和执行者分开。老规矩，举个范例吧。
 *
 * 假设李老板是一家公司的头儿，他现在让他的秘书王小姐去送一封信。
 *
 * 王小姐当然不会自己亲自把信送到目的地，她会把信交给邮局来完成整个投递的全过程。
 *
 * 现在，我们就对投递者、命令、发令者分别作出定义。
 */

/*
 * 首先定义post的相关数据
 */
typedef struct post
{
	void (*do)(struct post * post);
}post;

/*
 * Post完成了实际的投递工作，那么命令呢
 */
typedef struct command
{
	void * pdata;
	void (*exe)(struct command * pcommand);
}command;

void post_ext(struct command * pcommand)
{
	assert(NULL != pcommand);

	(post*)(pcommand->pdata)->do((post*)(pcommand->pdate));
}

/*
 * 我们看到了Post、Command的操作，那么剩下的就是boss的定义了
 */
typedef struct boss
{
	command * pcommand;
	void (*call)(struct boss pboss);
}boss;

void boss_call(struct boss * pboss)
{
	assert(NULL != pboss);

	pboss->pcomand->exe(pboss->pcommand);
}